package redispkg

import (
	"context"
	"fmt"
	"mygame/config"
	"mygame/pkg/logger"
	"strconv"
	"time"

	"github.com/go-redis/redis/v8"
)

var (
	Rdb *redis.Client
	Ctx context.Context
)

func init() {
	// fmt.Println("== redis ==")
	Rdb = redis.NewClient(&redis.Options{
		Addr:     config.App.Redis.Host + ":" + strconv.Itoa(config.App.Redis.Port), // Redis 服务器地址
		Password: config.App.Redis.Password,                                         // 密码
		DB:       config.App.Redis.DB,                                               // 使用默认 DB
	})

	Ctx = context.Background()

	// 测试连接
	_, err := Rdb.Ping(Ctx).Result()
	if err != nil {
		logger.Error(map[string]interface{}{"database error": err})
		fmt.Println("Failed to connect to Redis")
	} else {
		fmt.Println("Connected to Redis")
	}
}

// 获取分布式锁
func AcquireLock(lockKey string, timeout time.Duration) (bool, string) {
	// 生成一个唯一的锁值（避免误删其他客户端的锁）
	lockValue := fmt.Sprintf("lock:%d", time.Now().UnixNano())

	// 尝试获取锁
	result, err := Rdb.SetNX(Ctx, lockKey, lockValue, timeout).Result()
	if err != nil {
		logger.Error(map[string]interface{}{"Failed to acquire lock": err})
		return false, ""
	}

	// 返回是否成功获取锁以及锁的值
	return result, lockValue
}

// 释放分布式锁
func ReleaseLock(lockKey string, lockValue string) bool {
	// 使用 Lua 脚本确保只有锁的持有者才能释放锁
	luaScript := `
	if redis.call("GET", KEYS[1]) == ARGV[1] then
		return redis.call("DEL", KEYS[1])
	else
		return 0
	end
	`

	// 执行 Lua 脚本
	result, err := Rdb.Eval(Ctx, luaScript, []string{lockKey}, lockValue).Result()
	if err != nil {
		logger.Error(map[string]interface{}{"Failed to release lock": err})
		return false
	}

	// 如果返回值为 1，表示锁释放成功
	return result == int64(1)
}
